#include <stdio.h>
#include <cuda_runtime.h>


__global__ void kernel(float *da, int n) {
    printf("\n");
    for (int i = 0; i < n; ++i) {
        printf(" %.2f ", da[i]);
    }
    printf("\n");
}


int main() {

    // host数据 
    float ha[16]{0};
    ha[0] = 10.5;
    ha[3] = 5.1;

    // device数据 
    float *da;
    cudaMalloc((void **)&da, sizeof(float) * 16);

    // h2d 
    cudaMemcpy(da, ha, sizeof(float) * 16, cudaMemcpyHostToDevice);  // 同步操作 

    // 创建两个cudaEvent
    cudaEvent_t start, stop;
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    // 向默认stream中入队1个start事件
    cudaEventRecord(start);

    // 启动kernel 
    kernel<<<1, 1>>>(da, 16);

    // 向默认stream中入队1个stop事件
    cudaEventRecord(stop);

    // 等待kernel完成 
    // cudaDeviceSynchronize();

    // 等待默认流的stop事件完成（stop事件完成了，说明前面的start事件、kernel执行都完成了，同一个stream中的事件、kernel都作为一个task，同步入队，顺序执行）
    cudaEventSynchronize(stop);

    // 根据start、stop两个事件获取kernel耗时
    float time;
    cudaEventElapsedTime(&time, start, stop);
    printf("kernel执行耗时：%.2f ms\n", time);

    // 清除事件
    cudaEventDestroy(start);
    cudaEventDestroy(stop);


    return 0;
}